#include "sntp_system_time.h"

/****************************************
 * 以阻塞方式立刻从NTP服务器获取时间
 * 输入: retry_times_max  最大重试次数<255
 * 输出：校时状态
 * 	     0	SNTP_SUCCESS
 * 	     1  SNTP_TIMEOUT
 * 注意：调用该函数即开启自动同步功能，
 * 		 同步周期默认1小时，可调用函数
 *		 SntpSyncCycleSet()设置同步周期。
 *		 如需通知同步结果，使用
 ****************************************/
SNTP_STATUE SntpGetTimeImed(uint8_t retry_times_max)
{
	uint8_t retry=0;

	/*初始化SNTP并校时*/
	esp_sntp_setoperatingmode(SNTP_OPMODE_POLL);
	esp_sntp_setservername(0, NTP_URL);
	esp_sntp_init();

	/*设置时区并获取系统时间*/
	setenv("TZ", "CST-8", 1);
	tzset();
    
	while (sntp_get_sync_status() != SNTP_SYNC_STATUS_COMPLETED && retry < retry_times_max)
    {
		retry++;;
		vTaskDelay(500 / portTICK_PERIOD_MS);
	}

	sntp_set_sync_status(SNTP_SYNC_STATUS_RESET);		//复位同步结果

	if(retry == retry_times_max)
	{
		printf("SNTP Sync Time Out(Retry %d Times)\n" , retry_times_max);
		return SNTP_TIMEOUT;
	}
	else
	{
		printf("SNTP Sync Successful(Retry %d Times)\n" , retry);
        return SNTP_SUCCESS;
	}
   
}

/***************************************
 * 控制台输出当前时间
 * 输入：无
 * 输出：无
 **************************************/
void SysTimeConsoleOutput(void)
{
	time_t now;
	struct tm timeinfo;
	char strftime_buf[64];

	time(&now);						//获取系统时间
	localtime_r(&now, &timeinfo);	//将获取到的系统时间s转换为带有格式的timeinfo信息
	strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo);
	printf("System Time: %s\n" , strftime_buf);
}

/**************************************
 * SNTP通知用户回调函数
 **************************************/
void SntpCallback(struct timeval *tv)
{
	if(sntp_get_sync_status() == SNTP_SYNC_STATUS_COMPLETED)
	{
		printf("Sntp Auto Sync Finish\n");
		SysTimeConsoleOutput();
	}
	else
	{
		printf("Sntp Auto Sync Fail\n");
	}
}

/**************************************
 * SNTP同步周期设定
 * 输入：cycle		同步周期：分钟
 * 输出：无
 **************************************/
void SntpSyncCycleSet(uint16_t cycle)
{
	sntp_set_sync_interval(cycle*60000);
}

/**************************************
 * 设置SNTP同步通知回调函数
 * 输入：callback	sntp_sync_time_cb_t样式的函数
 **************************************/
void SntpNoticeCallbackSet(sntp_sync_time_cb_t callback)
{
	sntp_set_time_sync_notification_cb(callback);
}

void sntp_system_time_init()
{
    SntpSyncCycleSet(SNTPSYNCCYCLE);
    SntpNoticeCallbackSet(SntpCallback);	//设置时间同步回调函数
    SntpGetTimeImed(50);
    SysTimeConsoleOutput();
}